﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace Wicresoft.UnifyShow.Business
{
    public class CacheHelper
    {
        /// <summary>   
        /// 获取当前应用程序指定CacheKey的Cache对象值    
        /// </summary>   
        /// <param name="CacheKey">索引键值</param>   
        /// <returns>返回缓存对象</returns>    
        public static object GetCache(string CacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            return objCache[CacheKey];
        }
        /// <summary>   
        /// 设置当前应用程序指定CacheKey的Cache对象值   
        /// </summary>   
        /// <param name="CacheKey">索引键值</param>   
        /// <param name="objObject">缓存对象</param>   
        public static void SetCache(string CacheKey, object objObject)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject);
        }

        public static void SetCacheWithAbsoluteExpiration(string CacheKey, object objObject)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject, null, DateTime.Now.AddHours(14), System.Web.Caching.Cache.NoSlidingExpiration);
        }
        /// <summary>   
        /// 设置当前应用程序指定CacheKey的Cache对象值   
        /// </summary>   
        /// <param name="CacheKey">索引键值</param>   
        /// <param name="objObject">缓存对象</param>   
        /// <param name="absoluteExpiration">绝对过期时间</param>   
        /// <param name="slidingExpiration">最后一次访问所插入对象时与该对象过期时之间的时间间隔</param>   
        public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
        }

        public static string GetKey(Type t, params object[] listParams)
        {
            string result = t.FullName.Replace(".", "_")+"_";
            for (int i = 0; i < listParams.Length; i++)
                result += listParams[i] == null ? "Null" : listParams[i] + "_";
            return result;
        }

        public static Tuple<string, T> TryGet<T>(Type t, params object[] listParams)
        {
            string key = GetKey(t, listParams);
            object result = GetCache(key);
            if (result != null)
            {
                return new Tuple<string, T>(null, (T)result);
            }
            else
            {
                return new Tuple<string, T>(key, default(T));
            }

        }

        public static void ClearCache()
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            List<object> keys = new List<object>();
            var caches=objCache.GetEnumerator();
            while (caches.MoveNext())
            {
                keys.Add(caches.Key);
            }
            foreach (var item in keys) objCache.Remove((string)item);
        }

    }

}
